package com.cneport.das.server.trans.core;

import com.cneport.das.common.model.base.Result;
import com.cneport.das.common.utils.DateUtil;
import com.cneport.das.common.utils.JsonUtil;
import com.cneport.das.common.utils.StringUtil;
import com.cneport.das.server.conf.ConfigCaches;
import com.cneport.das.server.trans.conf.Authen;
import com.cneport.das.server.trans.conf.CorpInfo;
import com.cneport.das.server.util.wmq.WebSphereMQHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @author GavinZhang
 * @version 1.0
 * @desc： server处理
 * @company 东方物通科技有限（北京）公司
 * @date 2021/8/22 23:15
 */
@Service
@Slf4j
public class TransService {

    @Autowired
    WebSphereMQHelper wMQHelper;
    @Autowired
    QueueMetaCache queueCaches;

    @Autowired
    ConfigCaches confCaches;

    public Result sendMsg(String qName, String message) {

        boolean ret = wMQHelper.send(qName, message);
        if (ret) {
            return Result.success();
        } else {
            return Result.fail("-1", "消息发送失败！", null);
        }
    }

    public Result receiveMsg(String qName, int cnt) {
        long start = System.currentTimeMillis();
        log.info("start receive: ");
        String ret = wMQHelper.receive(qName, cnt);
        long end = System.currentTimeMillis();
        log.info("finish receive，耗时 " + (end - start) + " 毫秒");
        if ("-1".equals(ret)) {
            return Result.fail("-1", "消息接收失败", null);
        } else {
            List<String> ls = JsonUtil.toList(ret, String.class);
            return Result.success("", ls);
        }

    }

    /**
     * 通过配置获取队列名称
     *
     * @param corpNo 公司编号
     * @param qtype  队列类型，1：请求队列，2：响应队列
     * @return
     */
    public String getQueueName(String corpNo, int qtype) {

        String retQName = "";

        Authen corpAuth = confCaches.getCorpAuthByCorpNo(corpNo);

        if (corpAuth == null) {
            log.error("corpNo:" + corpNo + "尚无授权配置信息");
            return "";
        }
        CorpInfo corpInfo = confCaches.getCorpInfoByCorpNo(corpNo);
        if (corpAuth == null) {
            log.error("corpNo:" + corpNo + "尚无公司登记的配置信息");
            return "";
        }
        String corpName = corpAuth.getCorpName();
        Authen auth = corpAuth;
        //只有日期，没有时间，格式：yyyy-MM-dd
        String expDate = corpInfo.getExpireDate();
        if (StringUtil.isBlank(expDate)) {
            log.error("授权配置中没有过期日期信息！");
            return "";
        }
        Date expDt = DateUtil.parse(expDate, "yyyy-MM-dd");
        if (expDt == null) {
            log.error("过期日期格式不正确 " + expDate + " ，正确的格式为 'yyyy-MM-dd' ！");
            return "";
        }
        if (expDt.getTime() > System.currentTimeMillis() && auth.getIsDel() == 0) {
            if (QueueTypeEnum.REQ_QUEUE.getValue() == qtype) {
                retQName = auth.getReqQueue();
            }
            if (QueueTypeEnum.RCV_QUEUE.getValue() == qtype) {
                retQName = auth.getRcvQueue();
            }
        }

        synchronized (this) {
            //防止出现数据库中存在，队列管理器中不存在。
            boolean exist = queueCaches.exists(retQName);
            //队列管理器中不存在
            if (!exist) {
                //刷新缓存
                queueCaches.loadQueues();
                exist = queueCaches.exists(retQName);
                {
                    if (!exist) {
                        if (qtype == QueueTypeEnum.REQ_QUEUE.getValue()) {
                            log.info("请求队列 " + retQName + " 不存在，现在开始创建！");
                            boolean rslt = wMQHelper.createQueue(retQName, corpName);
                            if (rslt) {
                                queueCaches.addExistQCache(retQName);
                                return retQName;
                            } else {
                                return "-4";
                            }
                        } else {
                            log.info("接收队列 " + retQName + " 不存在，请联系对方协商创建!请使用队列名称: " + retQName);
                        }
                    }
                }

            }
        }
        return retQName;
    }


}

